package com.huawei.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.data.CellData;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 使用 EasyExcel 安全读取 Excel 原始数据（仅 .xlsx）
 * 自动兼容 String 和 CellData 两种返回类型
 */
public class EasyExcelReader {

    public static List<List<String>> readToList(String filePath) {
        List<List<String>> result = new ArrayList<>();

        EasyExcel.read(new File(filePath))
                .registerReadListener(new AnalysisEventListener<Map<Integer, Object>>() {
                    @Override
                    public void invoke(Map<Integer, Object> rowMap, AnalysisContext context) {
                        // 计算最大列索引
                        int maxCol = rowMap.keySet().stream()
                                .mapToInt(Integer::intValue)
                                .max()
                                .orElse(-1);

                        List<String> row = new ArrayList<>();
                        for (int i = 0; i <= maxCol; i++) {
                            Object cellValue = rowMap.get(i);
                            String strValue = convertToString(cellValue);
                            row.add(strValue != null ? strValue : "");
                        }
                        result.add(row);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext context) {
                        // done
                    }
                })
                .sheet()
                .doRead();

        return result;
    }

    /**
     * 将 EasyExcel 返回的单元格值统一转为字符串
     *
     * @param cellValue 可能是 String、CellData、Number、Boolean 等
     * @return 字符串表示，null 表示空
     */
    private static String convertToString(Object cellValue) {
        if (cellValue == null) {
            return null;
        }

        // 情况1：已经是 String（EasyExcel 默认模式）
        if (cellValue instanceof String) {
            return (String) cellValue;
        }

        // 情况2：是 CellData（raw 模式）
        if (cellValue instanceof CellData) {
            return ((CellData<?>) cellValue).getStringValue();
        }

        // 情况3：其他类型（如 Double、Boolean 等）
        return cellValue.toString();
    }

    public static String[][] readToArray(String filePath) {
        List<List<String>> list = readToList(filePath);
        if (list.isEmpty()) return new String[0][0];

        int maxCols = list.stream().mapToInt(List::size).max().orElse(0);
        String[][] array = new String[list.size()][maxCols];
        for (int i = 0; i < list.size(); i++) {
            List<String> row = list.get(i);
            for (int j = 0; j < row.size(); j++) {
                array[i][j] = row.get(j);
            }
        }
        return array;
    }
}